/*  lex.h
    
    Header file for the Lex class

    Nicholas Green
    Lexical Analyzer
*/

#ifndef LEX_H
#define LEX_H
#include "lexeme.h"

class Lex
{
public:
  Lex(FILE* fp);
  ~Lex(void);
  Lexeme* lex(void);

private:
  FILE* file;
  char getNextChar();
  void pushStack(char);
  char popStack();
  Lexeme* lexInteger(char);
  Lexeme* lexReal(char);
  Lexeme* lexString(char);
  Lexeme* lexOp(char);
  Lexeme* isType(const char* buffer, int size);
  Lexeme* isType(const char* buffer, int size, u8 ptrArray, int arrayType);
  Lexeme* lexComment(char);
  int lines;

  Lexeme* fStyle(char* buffer, int size);  
  bool skipWhiteSpace();
  char stack;
  bool stack_available;
  bool lexSymDelimiter(char ch);
  bool lexOpDelimiter(char ch);
  bool validTypeOrVar(char ch);
};
#endif
